home *** CD-ROM | disk | FTP | other *** search
- /* Session control */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include "dbox.h"
- #include "global.h"
- #include "config.h"
- #include "mbuf.h"
- #include "netuser.h"
- #include "timer.h"
- #include "tcp.h"
- #include "ftp.h"
- #include "telnet.h"
- #include "finger.h"
- #include "ping.h"
- #include "session.h"
- #include "cmdparse.h"
- #include "misc.h"
-
- #define Wininfo1_Host 16
- #define Wininfo1_Addr 18
- #define Wininfo1_Type 20
- #define Wininfo1_Status 1
- #define Wininfo1_SRTT 3
- #define Wininfo1_TWindow 5
- #define Wininfo1_RWindow 6
- #define Wininfo1_TTotal 11
- #define Wininfo1_RTotal 12
-
- #define Wininfo2_Host 1
-
- #define Wininfo3_Host 1
-
- #define Wininfo4_Host 1
- #define Wininfo4_Addr 3
- #define Wininfo4_Type 5
- #define Wininfo4_Interval 7
- #define Wininfo4_Size 9
-
- struct session *sessions;
- char notval[] = "Not a valid control block\n";
- char badsess[] = "Invalid session\n";
-
- void session_close(struct session *s)
- {
- switch(s->type){
- case TELNET:
- close_tcp(s->cb.telnet->tcb);
- break;
- case FTP:
- close_tcp(s->cb.ftp->control);
- break;
- case FINGER:
- close_tcp(s->cb.finger->tcb);
- break;
- case DEAD:
- Window_Close(s->window);
- freesession(s);
- break;
- default:
- break;
- }
- }
-
- void session_reset(struct session *s)
- {
- switch(s->type){
- case TELNET:
- reset_tcp(s->cb.telnet->tcb);
- break;
- case FTP:
- if(s->cb.ftp->data != NULLTCB){
- reset_tcp(s->cb.ftp->data);
- s->cb.ftp->data = NULLTCB;
- }
- reset_tcp(s->cb.ftp->control);
- break;
- case FINGER:
- reset_tcp(s->cb.finger->tcb);
- break;
- case DEAD:
- Window_Close(s->window);
- freesession(s);
- break;
- default:
- break;
- }
- }
-
- void session_kick(struct session *s)
- {
- switch(s->type){
- case TELNET:
- kick_tcp(s->cb.telnet->tcb);
- break;
- case FTP:
- kick_tcp(s->cb.ftp->control);
- if(s->cb.ftp->data != NULLTCB)
- kick_tcp(s->cb.ftp->data);
- break;
- case FINGER:
- kick_tcp(s->cb.finger->tcb);
- break;
- case DEAD:
- Window_Close(s->window);
- freesession(s);
- break;
- default:
- break;
- }
- }
-
- void session_info(struct session *s)
- {
- extern char *tcpstates[];
- struct tcb *tcb;
- struct ping *pp;
- dbox d;
-
- switch (s->type)
- {
- case RESOLVING:
- if ((d = dbox_new("wininfo2")) == NULL) return;
- dbox_setfield(d, Wininfo2_Host, s->name);
- break;
- case FTP:
- if ((d = dbox_new("wininfo1")) == NULL) return;
- dbox_setfield(d, Wininfo1_Host, s->name);
- dbox_setfield(d, Wininfo1_Addr, inet_ntoa(s->addr));
- dbox_setfield(d, Wininfo1_Type, "FTP");
- tcb = s->cb.ftp->control;
- break;
- case TELNET:
- if ((d = dbox_new("wininfo1")) == NULL) return;
- dbox_setfield(d, Wininfo1_Host, s->name);
- dbox_setfield(d, Wininfo1_Addr, inet_ntoa(s->addr));
- dbox_setfield(d, Wininfo1_Type, "TELNET");
- tcb = s->cb.telnet->tcb;
- break;
- case FINGER:
- if ((d = dbox_new("wininfo1")) == NULL) return;
- dbox_setfield(d, Wininfo1_Host, s->name);
- dbox_setfield(d, Wininfo1_Addr, inet_ntoa(s->addr));
- dbox_setfield(d, Wininfo1_Type, "FINGER");
- tcb = s->cb.finger->tcb;
- break;
- case PING:
- if ((d = dbox_new("wininfo4")) == NULL) return;
- dbox_setfield(d, Wininfo4_Host, s->name);
- dbox_setfield(d, Wininfo4_Addr, inet_ntoa(s->addr));
- dbox_setfield(d, Wininfo4_Type, "PING");
- pp = s->cb.ping;
- dbox_setnumeric(d, Wininfo4_Interval, pp->interval);
- dbox_setnumeric(d, Wininfo4_Size, pp->size);
- break;
- case DEAD:
- if ((d = dbox_new("wininfo3")) == NULL) return;
- dbox_setfield(d, Wininfo3_Host, s->name);
- break;
- default:
- break;
- }
-
- switch (s->type)
- {
- case FTP:
- case TELNET:
- case FINGER:
- dbox_setfield(d, Wininfo1_Status, tcpstates[tcb->state]);
- dbox_setnumeric(d, Wininfo1_SRTT, tcb->srtt);
- dbox_setnumeric(d, Wininfo1_TWindow, tcb->snd.wnd);
- dbox_setnumeric(d, Wininfo1_RWindow, tcb->rcv.wnd);
- dbox_setnumeric(d, Wininfo1_TTotal, tcb->snd.una - tcb->iss - 1);
- dbox_setnumeric(d, Wininfo1_RTotal, tcb->rcv.nxt - tcb->irs - 1);
- dbox_show(d);
- dbox_fillin(d);
- dbox_dispose(&d);
- break;
- case RESOLVING:
- case PING:
- case DEAD:
- dbox_show(d);
- dbox_fillin(d);
- dbox_dispose(&d);
- default:
- break;
- }
- }
-
- struct session *newsession(char *title)
- {
- register int i;
-
- for (i = 0; i < nsessions; i++) {
- if (sessions[i].type == FREE) {
- if ((sessions[i].window = Window_Open((void *)(sessions + i), title)) == NULL)
- return NULLSESSION;
- sessions[i].bufptr = sessions[i].buffer;
- return &sessions[i];
- }
- }
-
- return NULLSESSION;
- }
-
- void detachsession(struct session *s)
- {
- if (s == NULLSESSION)
- return;
-
- Window_Write(s->window, "\nPlease close this window.\n", 27);
-
- s->parse = NULLVFP;
- s->type = DEAD;
- }
-
- void freesession(struct session *s)
- {
- if (s == NULLSESSION)
- return;
- if (s->name != NULLCHAR) {
- free(s->name);
- s->name = NULLCHAR;
- }
- s->type = FREE;
- }
-
-